#ifndef EVENTDISPATCH_H
#define EVENTDISPATCH_H
#include <map>

#include "heap.h"
#include "event.h"

namespace reactor{

struct ReactorPrivate;
class Event;
class EventDispatch
{
public:
    /// 在构造的时候，就需要知道对应的（桥接)对象
    EventDispatch(ReactorPrivate *reactor);
    virtual ~EventDispatch(){}
    virtual int addHeap(Event *) = 0;
    virtual int removeHeap(Event *) = 0;
    virtual int add(Event *) = 0;
    virtual int remove(Event *) = 0;
    virtual int dispatch(std::map<Handle,Event *> * he_map) = 0;
protected:
    /// 事件堆放在这里，因为只有这个需要对事件堆进行操作
    /// 因为使用桥接模式，这里需要使用reactor的相关数据
    /// TODO 这里，并没有使用m_reactor,可以考虑移除
    ReactorPrivate * m_reactor;
    tkg::Heap<Node> m_time_heap;
};

/// 根据不同的系统，实现不同的策略，linux使用epoll，其他系统使用其他行为，这就是桥接的好处。可以支持不同的系统行为
class EpollEventDispatchImp : public EventDispatch {
public:
    EpollEventDispatchImp(ReactorPrivate *reactor);
    virtual ~EpollEventDispatchImp();
    int addHeap(Event *);
    int removeHeap(Event *);
    int add(Event *);
    int remove(Event *);
    int dispatch(std::map<Handle,Event *> * he_map);
private:
    int m_epoll;
    int m_fd_size;///当前建立的链接数
};

}

#endif // EVENTDISPATCH_H
